package com.xiaoming.e3mall.cart.interceptor;

import com.xiaoming.e3mall.common.utils.CookieUtils;
import com.xiaoming.e3mall.common.utils.E3Result;
import com.xiaoming.e3mall.pojo.TbUser;
import com.xiaoming.e3mall.sso.service.TokenService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 用户登录处理拦截器
 */
public class LoginInterceptor implements HandlerInterceptor {


    @Autowired
    private TokenService tokenService;

    /**
     * 进入 Handler方法之前执行
     * 用于身份认证、身份授权
     * 比如身份认证，如果认证不通过表示当前用户没有登陆，需要此方法拦截不再向下执行
     * return false表示拦截，不向下执行
     * return true表示放行
     */

    //emmm,全局的拦截器,添加购物车之前拦截一下判断是否登录
    //登录的话
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.首先从cookie中取token
        String token = CookieUtils.getCookieValue(request, "token", true);
        //2.如果没有token,说明没有登录直接放行
        if(StringUtils.isBlank(token))
            return true;
        //3.如果取到了token,需要调用sso的服务查询 用户的登录信息
        E3Result e3Result = tokenService.getUserByToken(token);
        //4.没有取到用户信息,直接放行
        if (e3Result.getStatus()!=200)
            return true;
        //5.取到用户信息,将用户信息放到request域中 放行
        TbUser user = (TbUser) e3Result.getData();
        request.setAttribute("user", user);
        return true;
    }


    /**
     * 进入Handler方法之后，返回modelAndView之前执行
     * 应用场景从modelAndView出发：将公用的模型数据(比如菜单导航)在这里传到视图，也可以在这里统一指定视图
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 执行Handler完成执行此方法
     * 应用场景：统一异常处理，统一日志处理
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) throws Exception {

    }


}
